#include <sys/wait.h>
#include "../ourhdr.h"

/***
 * 将文件复制到分页程序 
 */

#define  DEF_PAGER "/usr/bin/more"  /** defaykt oager origran */

int main(int argc, char *argv[])
{
    int n, fd[2];
    pid_t pid;
    char line[MAXLINE], *pager, *argv0;
    FILE *fp;
    if(argc != 2)
    {
        err_quit("usage: ipc02.cmd <pathname>");
    }
    if((fp= fopen( argv[1], "r"))== NULL)
    {
        err_sys("can't open %s", argv[1]);
    }

    if(pipe(fd) <0) 
    {
        err_sys("pipe error");
    }

    if((pid = fork())<0)
    {
        err_sys("fork error");
    }
    else if(pid > 0)   /** parent **/
    {
        close(fd[0]);   /** close read end*/
        while(fgets(line, MAXLINE, fp) !=NULL)
        {
            n = strlen(line);
            if(write(fd[1],line,n) != n)
            {
                err_sys("write error to pipe");
            }
        }

        if(ferror(fp))
        {
            err_sys("fgets error");
        }
        close(fd[1]);
        if(waitpid(pid, NULL, 0) <0)
        {
            err_sys("waitpid error");
        }
        exit(0);
    }
    else        /** child **/
    {
        close(fd[1]);   /* close write end */
        if(fd[0] != STDIN_FILENO )
        {
            if(dup2(fd[0],STDIN_FILENO) != STDIN_FILENO)
            {
                err_sys("dup2 error to stdin");
            }    
        }
        if((pager = getenv("PAGER")) == NULL)
        {
            pager = DEF_PAGER;
        }
        if((argv0 = strrchr(pager , '/'))!=NULL)
        {
            argv0++;
        }
        else
        {
            argv0= pager;
        }

        if(execl(pager,argv0, (char *) 0) < 0) 
        {
            err_sys("execl error for %s", pager);
        }

    }
}